#ifndef ARAL_DATA_STRUCTURE_DEFINITION_HPP #define ARAL_DATA_STRUCTURE_DEFINITION_HPP // Prevent Windows.h from defining interface macro #ifdef _WIN32 #ifdef interface #undef interface #endif #endif #include #include #include #include #include #include #include #include #include #include #include "aral/aral_any.hpp" // 包含自定义的any类 #include "aral/shapes.hpp" #include "aral/return_value_definition.hpp" #ifndef ARAL_ROBOT_DOF #include "aral/aral_config.h" #endif namespace ARAL { namespace interface { #define ARAL_CARTESIAN_DIMENSION 6 //笛卡尔空间自由度 #define ARAL_SENSOR_DIMENSION 6 //力传感器维度 #define ARAL_FT_SENSOR_CALIB_NUM 3 //力传感器标定对应的机器人位姿个数 #define ARAL_CONTROL_PERIOD 0.005 //机器人控制周期(unit: s) #define ARAL_DEFAULT_JERK_ACC_RATIO 5 //默认的Jerk/Acc值 #define ARAL_TP_DEFAULT_VEL_RATIO 1.0 //默认的速度调节比例 #define ARAL_TP_DEFAULT_ACC_RATIO 1.0 //默认的加速度调节比例 #define ARAL_TP_DEFAULT_CYCLE_TIME 0.005 //默认的规划周期 #define ARAL_TP_DEFAULT_BOW_HIGH_ERR 1e-4 //默认曲线弓高误差 #define ARAL_TP_DEFUALT_PATH_ID -1 // 默认的路径ID #define ARAL_TP_EPSILON 1e-3 // 默认的规划精度 #define ARAL_TP_DEFAULT_BUFF_NUMBER 3 // 默认缓冲的路点数(使用场景:动态规划) #define ARAL_TRAJECTORY_SAMPLE_CYCLE 5 // 辨识轨迹重复周期 #define ARAL_TRAJECTORY_SAMPLE_FREQUENCY 200 // 辨识轨迹测量频率 #define ARAL_TRAJECTORY_FOURIER_ORDER 5 // 傅里叶级数轨迹阶数 #define ARAL_TRAJECTORY_FOURIER_PERIOD 10 // 傅里叶级数轨迹周期 #define ARAL_IK_ITER_POS_EPS 2e-5 //逆解迭代的位置精度(m), 控制在0.02mm以内 #define ARAL_IK_ITER_ORI_EPS 1e-4 //逆解迭代的姿态精度(rad), 控制在0.0057°以内 #define ARAL_TUNE_POS_EPS 5e-3 // 位置调整阈值 #define ARAL_TUNE_ORI_EPS 1e-2 // 姿态调整阈值 #define ARAL_OPTIONAL // 可选参数 #define ARAL_READ_ONLY // 只读标记 #define ARAL_API_EXTENSION(version) virtual // 拓展接口, 是通用接口的另一种实现或者组合 #define ARAL_API_COMMON(version) virtual // 通用接口, 与机器人模型有关 #define ARAL_API_BASIC(version) virtual // 基础接口, 与机器人模型无关(即无需对算法库机器人模型进行初始化就可以调用的接口) #define ARAL_API_CUSTOM(version) virtual // 定制接口, 根据用户的特殊需求进行组合 #ifndef ARAL_DEPRECATED #ifdef _MSC_VER #define ARAL_DEPRECATED(msg) __declspec(deprecated(msg)) #else #define ARAL_DEPRECATED(msg) __attribute__((__deprecated__(msg))) // 废弃接口, version 表示从哪个版本后开始不再推荐使用 #endif #endif //!常用的机器人向量 using Array2d = std::array; using Array3d = std::array; using Array4d = std::array; using Array6d = std::array; #ifdef ARAL_ROBOT_DOF using ArrayNd = std::array; #else using VectorNd = std::vector; // 用户如果没有定义ARAL_ROBOT_DOF, 则关节对应的参数是一个动态数据, 用户需要保证该参数的维度和实际关节自由度一致 #endif using ModelHandle = int; // 模型句柄 using StateHandle = int; // 状态句柄 using PlannerHandle = int; // 规划器句柄 typedef Array6d RLWrench; // 某点的广义力在参考坐标系下的描述(前三个元素表示力, 后三个元素表示力矩) typedef Array6d RLPose; // 机械臂的位姿表示方式(前三个元素表示位置, 后三个元素用RPY欧拉角表示姿态, 欧拉角的定义域分别为(-PI, PI], [-PI/2, PI/2], (-PI, PI]) typedef Array6d RLTwist; // 某点的广义速度在参考坐标系下的描述(前三个元素表示线速度, 后三个元素表示角速度) typedef ArrayNd RLJntArray; // 机械臂维度列向量, 具体的维度和机器人自由度有关(目前支持自由度<=7的机械臂类型) typedef std::vector> DoubleVecVec; // 二维动态数值 typedef std::vector DoubleVec; // 一维动态数值 typedef std::pair OBBPairs; // 连杆OBB信息, 包含OBB的位姿和往XYZ三个方向的延展长度(单侧) typedef std::pairModelFiles; // 描述机器人的模型文件(包括机器人名称和资源文件路径) //=================================枚举类型定义========================== enum class LogLevel: int { FATAL = 0, // 严重错误, 一般需要清空算法状态 ERROR = 1, // 错误 WARN = 2, // 警告 INFO = 3, // 通知 DEBUG = 4, // 调试 VERBOSE = 5, // 啰嗦 }; //日志等级枚举类; 日志等级越高, 打印的日志越丰富 //! BEGIN: model 部分 enum class DescribeSpace: int { NOT_DEFINED = -1, // 未定义 JOINT = 0, // 关节空间描述 CARTESIAN = 1, // 笛卡尔空间描述 FULL = 2 // 全空间描述 };// 机械臂状态描述枚举 enum class OriDescription: int { ROTATION = 0, // 旋转矩阵: [Xx, Yx, Zx, Xy, Yy, Zy, Xz, Yz, Zz] RPY, // RPY欧拉角: [rx, ry, rz] ZYZ, // ZYZ欧拉角: [rz, ry, rz] ZYX, // ZYX欧拉角: [rz, ry, rx] QUATERNION, // 四元数: [w, x, y, z] AXIS_ANGLE // 轴角: [theta*x, theta*y, theta*z] };// 姿态描述方式 enum class CoordCalibMethod: int { O_X_XY = 0, // 原点、x轴正半轴、x、y轴平面的第一象限上任意一点(原点、x轴正半轴、y轴正半轴属于这种情况) O_X_XZ = 1, // 原点、x轴正半轴、x、z轴平面的第一象限上任意一点 O_Y_YZ = 2, // 原点、y轴正半轴、y、z轴平面的第一象限上任意一点(原点、y轴正半轴、z轴正半轴属于这种情况) O_Y_YX = 3, // 原点、y轴正半轴、y、x轴平面的第一象限上任意一点 O_Z_ZX = 4, // 原点、z轴正半轴、z、x轴平面的第一象限上任意一点(原点、z轴正半轴、x轴正半轴属于这种情况) O_Z_ZY = 5, // 原点、z轴正半轴、z、y轴平面的第一象限上任意一点 };// 坐标系标定方法 enum class DynCalibType: int { BODY_JNT_CURRENT = 10, //基于关节电流的本体动力学参数辨识 BODY_BASE_SENSOR = 20, //基于底座力传感器的本体动力学参数辨识(未实现) BODY_INT_EXT = 30, //基于底座力传感器和关节电流的本体动力学参数混合辨识(未实现) TOOL_JNT_CURRENT = 40, //基于关节电流的工具动力学参数辨识 TOOL_END_SENSOR = 50, //基于末端力传感器的工具动力学参数辨识 BODY_GRAVITY_JNT_CURRENT = 60, //基于关节电流的本体重力参数辨识(未实现) BODY_GRAVITY_BASE_SENSOR = 70, //基于底座力传感器的本体重力参数辨识(未实现) TOOL_GRAVITY_JNT_CURRENT_SINGLE_PASS = 80, //基于关节电流的工具重力参数辨识(单向轨迹) TOOL_GRAVITY_JNT_CURRENT_ROUND_TRIP = 90, //基于关节电流的工具重力参数辨识(往返轨迹) TOOL_GRAVITY_JNT_CURRENT_ONLINE = 100, //基于关节电流的工具重力参数在线辨识 }; // 动力学参数标定类型 enum class RobotConfiguration: int { //! L:R -> 朝前或朝后 //! U:D -> 肘向上或向下 //! F:N -> 腕部关节翻转或不翻转 //! 3个状态标志, 可以组合成 8 种状态 NONE = -1, LUF = 0, LUN = 1, LDF = 2, LDN = 3, RUF = 4, RUN = 5, RDF = 6, RDN = 7, Subspace = 8, // 选择同一个构型子空间里面的逆解,一般连续逆解对应的是同一个子空间里面的逆解 SubspaceOrNone= 9, // 优先选择同一个构型子空间内的逆解,如果没有,选择最近的解 };// 机械臂构型参数(具体说明见参考文档) enum class DisabledReason: int { NEVER = 0, DEFAULT, ADJACENT, ALWAYS, USER, NOT_DISABLED }; //连杆对不进行碰撞检测的原因结构体 enum class FrictionType: int { NOT_DEFINED = 0, // 未定义 LINEAR_MODEL = 1, // 线性模型(已废弃) QUADRATIC_MODEL = 2, // 二次模型(已废弃) VTL_Model = 31, // 速度、温度、负载模型 };// 摩擦力模型枚举 //! END: model 部分 //! BEGIN: plan 部分 enum class CurveType : int { LINE = 0, // 多段直线之间用Bezier曲线交融 MOVEP, // 多段直线之间用圆弧交融 ARC, // 圆弧 BSPLINE, // B样条 INTERSECTION_LINE, // 圆柱体相贯线 ARCHIMEDEAN_SPIRAL, // 阿基米德螺旋线 CUBIC_SPLINE, // 三次多项式样条 };//曲线类型 enum class MoveMode: int { POSITION = 0, // 位置级运动, 在路径上规划 VELOCITY // 速度级运动, 无路径, 直接进行轨迹规划 }; //运动规划模式 enum PlannerQueue { ExecutionQueue = 0, // 轨迹点数: 获取轨迹执行队列剩余轨迹点的个数 BufferQueue = 1, // 路径段数: 获取的是路径缓冲队列的路径段数(只是用户插入的一部分路径段) PathQueue = 2, // 路径段数: 获取的是用户插入到规划器的路径段数 = 轨迹执行队列的路径段数 + 路径缓冲队列的路径段数 };// 规划器队列类型 enum PlannerCapacity { LookAhead = 0, // 最大的前瞻段数 ExecutionTrajectory = 1, // 轨迹执行队列中最多的轨迹点数 };// 规划器容量类型 enum class PlannerStatus: int { IDEL = 0, RUNNING = 1, PAUSING = 2, PAUSED = 3, RESUMING = 4, STOPPING = 5, }; //规划器的状态(已废弃) enum class TaskState: int { IDEL = 0, RUNNING = 1, PAUSING = 2, PAUSED = 3, RESUMING = 4, STOPPING = 5, }; //规划器的状态(其中状态 IDEL 和 PAUSED 可由用户传入) enum TrajectoryTrackingStatus: int { TRACK = 0, // 跟踪 END = 1, // 结束跟踪 };// 轨迹跟踪状态 enum WeaveType: int { SINE = 0, // 正弦波 SPIRAL = 1, // 摆线 TRIANGLE = 2, // 三角形 TRAPEZOIDAL = 3, // 梯形 };// 摆动类型 enum OriInterpolationType: int { VARIABLE_ORIENTATION_AROUND_AXIS = 0, // 绕定轴转动 CONSTANT_ORIENTATION_RELATED_PATH, // 姿态与路径绑定,TCP位姿和路径相对姿态保持不变 VARIABLE_ORIENTATION_VIA_SOME_POINT_ORI, // 经过中间点姿态 };//路径姿态插值类型(主要针对圆弧路径) enum PlanMethod: int { POSITON_ORIENTATION_SYNCHRONIZATION_PLAN, // 位置和姿态同步规划 ONLY_POSITION_PLAN, // 只对位置速度规划,姿态随动 ONLY_ORIENTATION_PLAN, // 只对姿态速度规划,位置随动(未实现) };// 不同的规划方式 enum class StopType: int { PAUSE = 0, //暂停, 按照当前的最大加速度停止 STOP = 1, //停止, 按照指定的最大加速度停止 EMERGENCY = 2, //停止, 按照指定的最大速度停止(只在关节空间规划), 不保证停在原轨迹上 };// 机械臂停止类型 enum class PlannerRole : int { MASTER, // 主 SLAVE, // 从 REFERENCE, // 参考(外部规划) }; // 定义一个机器人在特定规划器中所扮演的角色。 enum class IKStrategy : int { NONE = 0, // 无 TRACK_IK_STRATEGY, // 导轨 + 机械臂 POSITIONER_IK_STRATEGY, // 变位机 + 机械臂 ROBOTIC_ARM_IK_STRATEGY, // 机械臂 + 机械臂 }; // 逆解策略(多机同步且要求自动分配运动时需指定) //! END: plan 部分 //! BEGIN: control 部分 enum class ControlMode: int { MOTION = 0, // 运动控制 JNT_ADM_FREE_DRIVE = 1, // 关节导纳拖动 JNT_ADM_SOFT_FLOAT, // 关节导纳软浮动 CART_ADM_SOFT_FLOAT, // 笛卡尔导纳软浮动 CART_ADM_FREE_DRIVE, // 笛卡尔导纳拖动 CART_IMP_FREE_DRIVE, // 笛卡尔阻抗拖动 };// 控制类型 enum class ControlType: int { MOTION = 0, // 运动控制 CARTESIAN_ADMITTANCE = 1, // 笛卡尔导纳控制 JOINT_ADMITTANCE = 2, // 关节导纳控制 CARTESIAN_IMPEDANCE = 3, // 笛卡尔阻抗控制 JOINT_IMPEDANCE = 4, // 关节阻抗控制 }; // 控制类型 enum class FTSensorType: int { END = 0, // 末端传感器信息 BASE = 1, // 底座传感器信息 JOINT = 2, // 关节传感器信息 }; //机械臂状态信息枚举 enum SingularType: int { NORMAL = 0, // 正常状态 APPROACH = 1, // 靠近奇异 LEAVE = 2, // 远离奇异 ALREADY = 3 // 已经奇异 }; // 奇异类型 enum class RobotSingularState: int { ERROR = -1, // 报错状态 NORMAL = 0, // 正常状态 APPROACH = 1, // 临近奇异 ALREADY = 2 // 已经奇异 }; // 奇异状态 enum ForceControlType: int { UNDEFINED = -1, // 未定义(基础指令集) SEARCH = 0, // 搜孔 INSERT = 1, // 插孔 CONTACT = 2, // 接触 SOFT = 3 // 柔顺 }; // 力控场景类型枚举 //! END: control 部分 //=================================结构体定义========================== //! BEGIN: model 部分 enum class WorkspaceConfig: int { Forward = 1, // 工作空间前半球 沿基坐标系+x Backward = 2, // 工作空间后半球 沿基坐标系-x }; struct RLInertia { double mass{0}; // 刚体质量 Array3d center{}; // 刚体质心位置(3*1数组) Array6d inertia{}; // 刚体惯性参数, 绕质心转动,对齐到参考坐标系, 顺序为 [Ixx, Iyy, Izz, Ixy, Ixz, Iyz]) };// 刚体动力学参数结构体 struct ToolWorkpiece { int type{-1}; // 主臂工具类型: 0: 末端工具; 1: 远端工具 RLPose tool{}; // 主臂工具位姿: // 1.机械臂不联动或者联动且为主机械臂: 末端工具下为TCP相对于主臂法兰坐标系的位姿; 远端工具下为TCP相对于自身基坐标系的位姿 // 2.双臂协同单轨迹时, 该字段用于描述主臂TCP位姿: 末端工具下为TCP相对于主臂法兰坐标系的位姿; 远端工具下为TCP相对于世界坐标系的位姿 RLInertia payload; // 主臂安装在法兰末端的工具或者工件的有效载荷 RLPose workpiece{}; // 路点参考系/工件位姿: // 1.机械臂不联动或者联动且为主机械臂: 末端工具下为工件坐标系相对于基坐标系的位姿, 远端工具下为工件坐标系相对于法兰坐标系的位姿 // 2.机械臂联动且为从机械臂: 末端工具下为工件坐标系相对于主臂法兰坐标系的位姿, 远端工具下为工件坐标系相对于从臂法兰坐标系的位姿 // 3.双臂协同单轨迹时, 该字段表示协同对象/路点参考系在世界坐标系下的位姿 std::optional type_s{}; // 从臂工具类型,仅双臂协同单轨迹时使用: 0: 末端工具; 1: 远端工具 std::optional tool_s{}; // 从臂工具位姿,仅双臂协同单轨迹时使用: // 末端工具下为TCP相对于从臂法兰坐标系的位姿; 远端工具下为TCP相对于世界坐标系的位姿 std::optional payload_s{}; // 从臂安装在法兰末端的工具或者工件的有效载荷,仅双臂协同单轨迹时使用 };// 工具工件信息 struct FrictionParam { FrictionType type{FrictionType::NOT_DEFINED}; // 摩擦力模型类型 std::vector para{}; // 具体模型参数,存在机械臂的各个模块中, 含义由算法定义 };// 关节摩擦参数结构体 struct DHPara { bool modified; //DH 建模方式 RLJntArray alpha; // 偏转角 RLJntArray a; // 偏置 RLJntArray d; // 杆长 RLJntArray theta; // 零位 RLJntArray beta; // 平行轴夹角 };//机械臂DH参数(这种数据结构在0.39版本中废弃) struct DHParameter { bool modified; // DH 建模方式 bool fixed; // 是否为固定连杆 double alpha; // 偏转角 double a; // 偏置 double d; // 杆长 double theta; // 零位 double beta; // 平行轴夹角 };//机械臂连杆DH参数 struct TrackIKConfigInfo { int type{0}; // 逆解策略类型(0: 垂直投影, 1: 相位投影) //! 垂直投影设置 Array3d offset_params{}; // 导轨求逆解时, 设置的偏移参数(给导轨末端添加一个box, 这里设置box的长宽高,对应{x, y, z}); Array3d track_ref{}; // 导轨的参考位置 //! 相位投影设置 std::array track_range{}; // 导轨运动区间 double phase_scale; // 相位投影比例参数 };// 导轨逆解参数(已废弃) struct IKConfigInfo { RLPose goal; // 目标, end in base RLJntArray q_ref{}; // 参考关节角 DoubleVec upper_bound{}; // 关节限制上限, 为空则无限制 DoubleVec lower_bound{}; // 关节限制下限, 为空则无限制 DoubleVec weight_js{}; // 关节空间的权值, 为空则无权重 Array2d sol_tolerance; // 位置_姿态误差阈值(精度越高, 迭代次数越多), 如果有参数设置为非零, 则采用迭代解 RobotConfiguration config{RobotConfiguration::NONE}; // 按照给定构型选择逆解, 如果为 NONE, 按照参考关节角和加权值选择逆解 double timeout; // 迭代逆解容许计算时间, 单位: 微秒(us), 参考值为400us };// IK 输入参数结构体 struct DataFeature { double average{0.0}; // 均值 double std{0.0}; // 标准差 double max{0.0}; // 最大值 double rms{0.0}; // 均方根 };// 标定误差结构体 struct BodyCalibResult { std::vector link_para{0.0}; // 连杆动力学参数,m1 mx1 my1 mz1 Jxx1 Jxy1 Jxz1 Jyy1 Jyz1 Jzz1 ... m6 ... Jzz6; std::vector joint_rotor_inertia{0.0}; // 关节转子惯量 std::vector joint_friction_para{0.0}; // 摩擦力参数 std::vector error; // 辨识误差,辨识参数映射到 关节力距/底座六维力 与 实际力距/六维力 的误差 };// 本体辨识结果 struct ToolCalibResult { RLInertia inertia; // 工具在法兰坐标系下的惯性参数 std::vector error; // 标定误差, 为辨识误差映射到末端力和力矩误差或者映射到关节轴的力矩误差 };// 负载辨识结果 struct CalibConfig { DynCalibType type; // 动力学参数辨识类型 std::vector move_axis; // 运动的轴(ID), 下标从0开始, 如[3, 5]代表运动关节为4,6关节 std::vector init_joint; // 轨迹的起始关节角 int sample_frequency{ARAL_TRAJECTORY_SAMPLE_FREQUENCY}; // 测量轨迹的采样频率 };//工具标定配置信息 struct CalibTrajectoryFeature { CalibConfig config; // 激励轨迹配置 DoubleVec coeff; // 激励轨迹系数 };//激励轨迹特征信息 struct RobotKinCalibPara { Array6d base; //robot1 base 相对于 robot2 base 的位姿, 采用 [rz tz rx tx rz tz] 的方式描述 Array6d tcp; //robot2 flange 相对于 robot1 flange的位姿, 采用 [rz tz rx tx rz tz] 的方式描述 DHPara dh1; //robot1 DH 参数 DHPara dh2; //robot2 DH 参数 }; // 运动学标定结果 struct RobotKinCalibDualInput { RLJntArray q1; // robot1 关节位置 RLJntArray tau1; // robot1 关节外力矩 RLJntArray q2; // robot2 关节位置 RLJntArray tau2; // robot2 关节外力矩 }; // 双臂标定数据输入 struct GeometryCollisionResult { bool collision{false}; // 是否发生碰撞 double distance{(std::numeric_limits::max)()}; // 两连杆之间的最短距离 std::size_t contact_count{0}; // 碰撞点的个数 std::vector> collision_info; // 具体碰撞信息(碰撞连杆1, 碰撞连杆2, 嵌入深度, 碰撞发生点) };//碰撞数据 struct GeometryDistanceResult { double distance{(std::numeric_limits::max)()}; // 两连杆之间的最短距离 Array3d nearest_points[2]; // 距离最近的两点坐标(在基坐标系下描述) std::string link_names[2]; // 两连杆名字 Array3d normal; // 两点连接法线方向 };//距离数据 struct LinkPairData { DisabledReason reason{DisabledReason::NOT_DISABLED}; bool disable_check{false}; };//连杆对详细信息结构体 //! END: model 部分 //! BEGIN: plan 部分 enum class BlendProperty: int { NORMAL = 0, // 非交融段 WAIT_BLEND, // 待交融段(交融点到路径终点段,等待交融) LEFT_BLEND, // 路径头交融段 RIGHT_BLEND, // 路径尾交融段 };// 交融属性 struct PathPoint { double id{ARAL_TP_DEFUALT_PATH_ID}; // 路径ID double blend_id{ARAL_TP_DEFUALT_PATH_ID}; // 路点位于交融路径段的ID,非交融段无意义 DescribeSpace type{DescribeSpace::NOT_DEFINED}; // 路径点类型 RLPose pose{}; // 笛卡尔空间位姿 RLJntArray joint_m{}; // 当前规划器MASTER的关节构型(单机器人时即该机器人) RLJntArray joint_s{}; // 当前规划器SLAVE的关节构型;双臂显式关节规划与joint_m配套使用 ToolWorkpiece t_w; // 路径点上的工具工件信息 BlendProperty blend_mode{BlendProperty::NORMAL}; // 路点位于路径段的标志, 0表示用户插入路径(非交融段), 1表示交融区域(交融点到路径终点段), 2表示交融路径段(交融段) IKStrategy ik_strategy{IKStrategy::NONE}; // 双臂联动且要求自动分配机械臂的运动路径,目前机械臂和导轨、变位机同步运动需明确指定,其他采用默认值即可 };// 路径点结构体(用于描述几何信息) struct TrajectoryPoint { ModelHandle id; // 机器人ID MoveMode mode; // 轨迹点对应的运动模式(0: 位置模式; 1: 速度模式) double time; // 轨迹点对应的路径完成时间, 取值[0, duration] PathPoint point; // 轨迹点对应的路径描述点 RLTwist xd{}, xdd{}; // 轨迹点对应的笛卡尔空间速度 加速度 RLJntArray qd{}, qdd{}; // 轨迹点对应的关节空间速度 加速度 RLJntArray effort{}; // 轨迹点对应的关节电流 RLWrench wrench{}; // 轨迹点对应的TCP处的力/力矩 Array3d phase; // 相位pva double progress{}; // 轨迹执行进度 };// 轨迹(插值)点结构体 struct IntersectionParameters { double r; // 小圆柱体半径 double R; // 大圆柱体半径(R >= r) double alpha; // 小圆柱体轴线和大圆柱体轴线的夹角 double D; // 小圆柱体轴线和大圆柱体轴线的距离 }; // 圆柱体相贯线结构体 struct ArchimedeanspiralParameters { double step_size; // 每转一圈螺旋运动对应圆半径增加的步长(正值为外扩,负值为内缩) double alpha; // 螺旋运动角度范围(正值为逆时针,负值为顺时针) double growth_rate{0}; // 每转一圈螺旋运动对应z轴方向增加的步长(正值为上升,负值为下降) }; // 阿基米德螺旋线结构体 struct SuperimposedParameters { bool enable{false}; // 使能路径叠加功能(在运动路径的法平面内进行叠加) double vel; // 焊接速度 WeaveType type; // 摆动类型(针对焊接应用, 支持正弦,摆线) double frequency{0}; // 摆动频率,范围[0.1, 5], 单位: Hz Array2d amplitude{{0, 0}}; // 一个周期内在运动叠加方向的最大幅值(不一定对称),当复用为摆线的幅值时,只用第一个元素 Array2d hold_distance{{0, 0}}; // 运动到最大幅值处保持的距离(不一定对称),当复用为摆线的宽度时,只用第一个元素 Array2d hold_time{{0, 0}}; // 运动到最大幅值处停留的时间(不一定对称),暂只支持正弦 double angle{0}; // 运动叠加方向与法平面的夹角,单位rad int direction{0}; // 摆线起始摆动方向, 0表示在路径方向上方, 1表示在路径方向下方 double ori_weave_range{0}; // 姿态摆动范围(0~ori_weave_range),主要和阿基米德螺旋线配合使用,实现力控搜孔应用 double ori_weave_frequency{0}; // 姿态摆动频率(单位弧长对应的摆动次数) 范围: [0, 1] int adjust_cycle_num{0}; // 动态调节频率和幅值时, 指定的过渡段数量 double azimuth{0}; // 摆焊波形方位角, 单位rad double ridge_height{0}; // 中心上升高度 }; // 叠加路径属性 enum class ObstacleAvoidanceAlgorithm: int { RRTCONNECT = 0, // RRT-Connect LBKPIECE, // LBKPIECE RRT, // RRT }; // 路径规划类型 struct ObstacleAvoidanceParameters { ObstacleAvoidanceAlgorithm avoid_type{ObstacleAvoidanceAlgorithm::RRTCONNECT}; // 避障算法(默认RRTCONNECT算法) double maxDistance; // 规划步长 bool simplify{true}; // 使能路径简化功能 }; // 避障路径规划属性 struct CurveProperty { CurveType type; // 曲线类型 IntersectionParameters ip; // 圆柱体相贯线属性 ArchimedeanspiralParameters ap; // 阿基米德螺旋线属性 OriInterpolationType ori_int_type{OriInterpolationType::VARIABLE_ORIENTATION_AROUND_AXIS}; // 姿态插补类型 }; //复杂解析曲线属性 /** * @brief 路径交融说明: * 1: blend_radius 有两重含义, 当其值为非负数时表示对应路径的始末点速度可以不为零; 其值为正数时表示交融半径的大小 * 2: 需要同时设置始末点的交融属性, 当上一个路径的结束点的交融半径非负时, 当前段起始点对应的交融半径也应为非负数, 否则按照设置错误处理 * 3: 笛卡尔空间的交融半径按照笛卡尔空间的位置弧长进行取值, 单位为米; 关节空间的交融半径按照关节空间的运动模长取值, 单位为弧度 * 4: 自适应增大交融半径须同时满足 adaptive_increase_blend_radius==true 且 blend_radius[i]>0(建议 1mm);仅满足其一不生效;<=0 不交融 */ struct PathProperty { DescribeSpace describe_space; // 描述空间 Array2d blend_radius{{0, 0}}; // 交融半径(<=0 不交融;>0 为交融;<1mm 时直接连接, 否则按照给定的值进行交融计算) bool adaptive_increase_blend_radius{false}; // 与 blend_radius[i]>0 同时满足时按 maxV[0] 自动计算半径(建议 1mm) double bow_high_err{ARAL_TP_DEFAULT_BOW_HIGH_ERR}; // 默认的弓高误差 PlanMethod plan_method{PlanMethod::POSITON_ORIENTATION_SYNCHRONIZATION_PLAN}; // 等效半径类型,不同的类型表示不同的规划方式 RLPose coord; // 如果路径描述空间是笛卡尔空间, 则表示参考坐标系相对基坐标系的位姿(V1.0 版本中只支持参考坐标系为基坐标系的情况) CurveProperty cur_prop; // 复杂曲线运动属性 };// 路径属性结构体(跟时间无关,影响几何路径生成) struct MoveProperty { MoveMode move_mode{MoveMode::POSITION}; // 位置或者速度运动{0:位置; 1:速度} double keep_time{0}; // 目标状态持续时间 bool dynamic_adjust_motion_constraints{false}; // 动态调整运动约束标志,如果置为true,则会在每个取点周期计算运动约束,对当前轨迹段重新进行速度规划.一般用于时间最优规划或要求线速率匀速的场景 bool time_optimal{false}; // 时间最优标志,开启后会使参考轨迹同时满足运动学和动力学约束 /** 运动到目标状态需要的时间. 如果为空, 则规划器会按最大速度自动规划相关轨迹; 如果指定该参数,则以该时间为规划约束信息, 尽可能是运动到达时间逼近给定的时间 (给定时间序列的维度和目标点的维度必须一致, 即如果有N个目标点, 则需要有N个到达时间, 到达时间序列必须严格递增) **/ std::vector move_times{}; std::vector tarV{}; // 目标运动速度, 如果为空, 表示目标速度为零 std::vector tarA{}; // 目标运动加速度, 如果为空, 表示目标加速度为零 std::vector maxV; // 最大运动速度 std::vector maxA; // 最大运动加速度 std::vector maxJ; // 最大运动加加速度 };// 运动属性结构体(跟时间相关,影响轨迹生成) struct RobotRole { ModelHandle model_handle; StateHandle state_handle; PlannerRole role = PlannerRole::MASTER; // 对于单机器人规划器,默认为主机器人是合理的 }; // 将一个机器人状态句柄与其在规划器中的角色关联起来。 //! END: plan 部分 //! BEGIN: control 部分 struct JointCommand { RLJntArray q{}; // 关节指令位置 RLJntArray qd{}; // 关节指令速度 RLJntArray qdd{}; // 关节指令加速度 RLJntArray torq{}; // 关节指令力矩 }; // 关节命令输出结构体 struct JointCollisionResult { bool collision{false}; // 是否发生碰撞 std::vector collision_flag; // 碰撞关节标志 RLJntArray contact_torque{}; // 碰撞力矩 };//碰撞数据 struct EndCollisionResult { bool collision{false}; // 是否发生碰撞 std::vector collision_flag; // 碰撞方向标志 RLWrench contact_wrench{}; // 碰撞力 };//碰撞数据 struct CollisionResult { bool collision{false}; // 是否发生碰撞 std::vector collision_flag; // 碰撞方向标志 std::vector collision_force{}; // 碰撞力 };//碰撞数据 struct Collision { DescribeSpace space; // 检测碰撞或接触点位置(关节或末端) RLJntArray cur_jnt_vel; // 关节实际速度 RLJntArray cur_jnt_acc; // 关节实际加速度 RLJntArray cur_jnt_dyn; // 关节动力学力矩(通过 rsGetJointDynamicTorque 接口获取) RLJntArray cur_jnt_fri; // 关节摩擦力矩 RLJntArray cur_jnt_torq; // 关节实际力矩 RLJntArray ext_jnt_torq; // 关节接触力矩(通过 rsGetJointExternalTorque 接口获取) RLWrench end_wrench_in_end; // 末端末端坐标系下外力(通过 rsGetEndExternalWrenchInEnd 接口获取) RLPose detect_pose_in_end; // 检测坐标系相对于末端坐标系位姿 std::vector collision_threshold; // 碰撞检测阈值 }; // 碰撞检测输入结构体 struct CollisionDetectResult { bool collision{false}; // 是否发生碰撞 std::vector collision_joint_flag; // 关节碰撞标志 RLJntArray collision_joint_torq; // 关节碰撞力矩 std::vector collision_end_flag; // 末端碰撞标志 RLWrench collision_end_wrench; // 末端碰撞外力 }; // 碰撞检测输出结构体 struct FcDesignParam { std::vector damp; // 阻尼百分比[0,1] std::vector wrench_fre; // 传感器滤波频率 std::vector turn_fre; // 惯性环节对数幅频特性曲线的转折频率 std::vector limit; // 非力控方向上的位置跟踪误差限制; 力控方向上的速度限制 };// 力控设计参数结构体 struct FcDesignParams { ForceControlType type; // 力控场景类型 std::vector damp_scale; // 表征阻尼水平的百分比, 取值范围[0, 100%], 默认50% std::vector stiff_scale; // 表征软硬程度的百分比, 取值范围[0, 100%], 默认50% std::vector env_stiff; // 环境刚度(预留参数,接触环境时默认10000,未接触环境时默认0) };// 力控设计参数结构体 struct AdrcParams { std::vector enable_vec{}; // 使能向量 std::vector hat_ke; // 环境刚度 std::vector td_r; // 微分跟踪器跟踪速度因子 std::vector eso_alpha; // 扩张状态观器参数 }; // ADRC自抗扰功能参数结构体 struct SingularState { SingularType elbow; // 肘部 SingularType wrist; // 腕部 SingularType interior; // 内部 }; // 奇异状态 struct SingularProperty { RobotSingularState elbow; // 肘部 RobotSingularState wrist; // 腕部 RobotSingularState interior; // 内部 }; // 奇异属性结构体 struct ImpedanceParameters { DescribeSpace space; // 空间描述 ToolWorkpiece t_w; // 工具工件信息 RLJntArray q{}; // 关节位置 RLJntArray qd{}; // 关节速度 RLJntArray qdd{}; // 关节加速度 double* ft_data; // 传感器数据(扣除传感器偏置) };// 阻抗计算参数结构体 //! END: control 部分 typedef std::map, LinkPairData> LinkPairMap; typedef std::tuple, PathProperty, MoveProperty> MotionProperty; typedef std::unordered_map ConfigMap; //using TaskHandle = std::uint64_t; // 任务句柄 } //interface /** * @brief 日志处理函数, 用户可以设置该函数来控制日志的打印行为 * @param level: 日志等级 * @param filename: 日志发生的文件名 * @param line: 日志发生的文件行 * @param message: 日志内容 */ using LogHandler = std::function; /** * @brief 求机械臂所有位置逆解的插件接口函数 * @param eetrans: TCP 位置 * @param eerot: TCP 姿态矩阵 * @param dhPara: 机械臂的 DH 参数 * @param solutions: 所有逆解集合 */ using IKAllPlugin = std::function>& dhPara, std::vector>& solutions)>; //! ARAL 算法库接口类 namespace interface { class ARALIntface; typedef std::shared_ptr ARALIntfacePtr; } } //ARAL #endif //ARAL_DATA_STRUCTURE_DEFINITION_HPP